CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž s ApplyUpdates !!!!!
Otázka od: Ondřej Kaláb
30. 10. 2002 7:40
ApplyUpdates !!!!!
Zdravim všechny,
Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.
Mam takovy problem. Mam aplikaci pro editovani dat v databazi. Cele to
funguje tak, ze klient pracuje s daty v ClientDatasetech (je jich vic -
v Master-Detail vztazích - takto tam jsou 3). Tyto ClientDatasety
ziskavaji sva data z ADOQuery - každý ze sve pomoci DataSetProvider.
Vsechno se mo nacte, data v datasetech si upravuju v pohode. Potiz
prijde pro ClientDataSet.ApplyUpdates, kdy mi to nahlasi chybu bud
"record not found or changed by another user" nebo "no key
specified"...
Tyto chyby nastanou pouze když byl zaznam smazan nebo
upraven. Pokud byl pridan novy zaznam, vse provehne OK.
Dluzno dodat, ze pokud mnepouzivam clientDatasety a data vkladam primo
do ADOQuery pomoci data-aware prvku, vsechno je OK. (dokonce funguje i
vkladani obrazku).
V helpu jsem si nasel, ze se da v DatasetProvide.BeforeUpdateData
definovat explicitne, která pole budou urcovat specificky zaznam a která
budou updatovatelna. Ale netusim jak to udelat. Jinak je moznost v
DatasetProvider.UpdateMode taktez specifikovat urcujici pole.
Zajimalo by me, jestli není třeba v datasetech nejak definovat index,
který je prim. Klicem v ADO tabulce, ze které dotaz bere data tak, aby
slo podle nej zaznam spokehlive urcit, ale zase když mam ty
clientDatasety v Master-Detail vztahu, jsou tam uz nadefinovany indexy
pro propojovane sloupce a ne pro primarni indexy tabulek.
Diky kazdemu za každý napad,
Ondřej Kaláb, DiS, Jihlava.
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002
Odpovedá: delfi
30. 10. 2002 9:37
ApplyUpdates !!!!!
HI,
pouzivam to takto a bez problemu:
procedure TmzdyServer00.dsp_PracovnikBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
with DM do
begin
// qPrac
// naplneni id_CPrac, pri nove vete
if (UpdateKind=ukInsert) and (SourceDS=qPrac) and
(deltaDS.FieldByName('id_CPrac').NewValue < 0) then
begin
spPracnew.execProc;
id_CPrac:=spPracnew.ParamByName('NextID').AsInteger;
deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
end;
// zapis vety
if (SourceDS=qPrac) then
begin
SetUSQLParams(UpdSQLPrac.Query[Updatekind], DeltaDS);
UpdSQLPrac.ExecSQL(UpdateKind);
Applied:=true;
end;
// qPracDeti
// naplneni id_CPrac, pri nove vete
if (UpdateKind=ukInsert) and (SourceDS=qPracDeti) and
(deltaDS.FieldByName('id_CPrac').NewValue < 0) then
begin
deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
end;
atd
procedure TmzdyServer00.SetUSQLParams(AQuery: TQuery;
ACDS: TClientDataset);
var
i: integer;
Old: Boolean;
Param: TParam;
PName: string;
Field: TField;
Value: Variant;
begin
with AQuery do
begin
for I := 0 to Params.Count - 1 do
begin
Param := Params[I];
PName := Param.Name;
Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
if Old then System.Delete(PName, 1, 4);
Field := ACDS.FindField(PName);
if not Assigned(Field) then Continue;
if Old then Param.AssignFieldValue(Field, Field.OldValue) else
begin
Value := Field.NewValue;
if VarIsEmpty(Value) then Value := Field.OldValue;
Param.AssignFieldValue(Field, Value);
end;
end;
end;
end;
Je to pro BDE, ale upravit pro ADobude malickost
ales
----- Original Message -----
From: "Ondřej Kaláb" <ondrej.kalab@webhouse.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 30, 2002 7:29 AM
Subject: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž s
ApplyUpdates !!!!!
Zdravim všechny,
Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.406 / Virová báze: 229 - datum vydání: 21.10.2002
Odpovedá: Ondřej Kaláb
30. 10. 2002 10:37
ApplyUpdates !!!!!
No, me ale pridavani zaznamu nejak zda se funguje. Co mi nefunguje je
mazani a modifikace. Pak to hlasi record not found... . A navíc u te
Query nepouzivam zadne parametry. Je to jen cisty dotaz do jedne tabulky
s definovanou podminkou. O te udalosti BeforeUpdataRecord jem uz taky
cetl. Tam bych nejka asi musel najit ten zaznam, který nemuze sam
ClientDataset najit podle id, ale nevim jak toho docilit....
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of delfi
Sent: Wednesday, October 30, 2002 8:58 AM
To: delphi-l@clexpert.cz
Subject: Re: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 -
potíž s ApplyUpdates !!!!!
HI,
pouzivam to takto a bez problemu:
procedure TmzdyServer00.dsp_PracovnikBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
with DM do
begin
// qPrac
// naplneni id_CPrac, pri nove vete
if (UpdateKind=ukInsert) and (SourceDS=qPrac) and
(deltaDS.FieldByName('id_CPrac').NewValue < 0) then
begin
spPracnew.execProc;
id_CPrac:=spPracnew.ParamByName('NextID').AsInteger;
deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
end;
// zapis vety
if (SourceDS=qPrac) then
begin
SetUSQLParams(UpdSQLPrac.Query[Updatekind], DeltaDS);
UpdSQLPrac.ExecSQL(UpdateKind);
Applied:=true;
end;
// qPracDeti
// naplneni id_CPrac, pri nove vete
if (UpdateKind=ukInsert) and (SourceDS=qPracDeti) and
(deltaDS.FieldByName('id_CPrac').NewValue < 0) then
begin
deltaDS.FieldByName('id_CPrac').NewValue := id_CPrac;
end;
atd
procedure TmzdyServer00.SetUSQLParams(AQuery: TQuery;
ACDS: TClientDataset);
var
i: integer;
Old: Boolean;
Param: TParam;
PName: string;
Field: TField;
Value: Variant;
begin
with AQuery do
begin
for I := 0 to Params.Count - 1 do
begin
Param := Params[I];
PName := Param.Name;
Old := CompareText(Copy(PName, 1, 4), 'OLD_') = 0;
if Old then System.Delete(PName, 1, 4);
Field := ACDS.FindField(PName);
if not Assigned(Field) then Continue;
if Old then Param.AssignFieldValue(Field, Field.OldValue) else
begin
Value := Field.NewValue;
if VarIsEmpty(Value) then Value := Field.OldValue;
Param.AssignFieldValue(Field, Value);
end;
end;
end;
end;
Je to pro BDE, ale upravit pro ADobude malickost
ales
----- Original Message -----
From: "Ondřej Kaláb" <ondrej.kalab@webhouse.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 30, 2002 7:29 AM
Subject: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž
s ApplyUpdates !!!!!
Zdravim všechny,
Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.406 / Virová báze: 229 - datum vydání: 21.10.2002
---
Příchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002
Odpovedá: hlas
30. 10. 2002 11:32
ApplyUpdates !!!!!
mam uplne ten isty problem s TSimpleDataSet a DBX.
tiez nie som schopny ulozit zaznam do databazy metodou
applyupdates, ak iny uzivatel medzitym, tento zaznam upravil.
----- Original Message -----
From: "Ondřej Kaláb" <ondrej.kalab@webhouse.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 30, 2002 7:29 AM
Subject: CLIENTDATASET + ADOQuery + MS SQL server.... + Delphi6 - potíž s
ApplyUpdates !!!!!
Zdravim všechny,
Zadam nekoho povolaneho, kdo ma zkusenosti s uvedenou (CLIENTDATASET +
ADOQuery + MS SQL server.... + Delphi6) ci podobnou konfiguraci.
Mam takovy problem. Mam aplikaci pro editovani dat v databazi. Cele to
funguje tak, ze klient pracuje s daty v ClientDatasetech (je jich vic -
v Master-Detail vztazích - takto tam jsou 3). Tyto ClientDatasety
ziskavaji sva data z ADOQuery - každý ze sve pomoci DataSetProvider.
Vsechno se mo nacte, data v datasetech si upravuju v pohode. Potiz
prijde pro ClientDataSet.ApplyUpdates, kdy mi to nahlasi chybu bud
"record not found or changed by another user" nebo "no key
specified"...
Tyto chyby nastanou pouze když byl zaznam smazan nebo
upraven. Pokud byl pridan novy zaznam, vse provehne OK.
Dluzno dodat, ze pokud mnepouzivam clientDatasety a data vkladam primo
do ADOQuery pomoci data-aware prvku, vsechno je OK. (dokonce funguje i
vkladani obrazku).
V helpu jsem si nasel, ze se da v DatasetProvide.BeforeUpdateData
definovat explicitne, která pole budou urcovat specificky zaznam a která
budou updatovatelna. Ale netusim jak to udelat. Jinak je moznost v
DatasetProvider.UpdateMode taktez specifikovat urcujici pole.
Zajimalo by me, jestli není třeba v datasetech nejak definovat index,
který je prim. Klicem v ADO tabulce, ze které dotaz bere data tak, aby
slo podle nej zaznam spokehlive urcit, ale zase když mam ty
clientDatasety v Master-Detail vztahu, jsou tam uz nadefinovany indexy
pro propojovane sloupce a ne pro primarni indexy tabulek.
Diky kazdemu za každý napad,
Ondřej Kaláb, DiS, Jihlava.
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.408 / Virová báze: 230 - datum vydání: 24.10.2002